package menus;

import bitclub.Alquiler;
import bitclub.Articulo;
import bitclub.ArticuloAlquilado;
import herramientas.BitUtil;
import bitclub.Cliente;
import bitclub.Movimiento;
import bitclub.OfertaDiaSemana;
import bitclub.OfertaNumeroArticulo;
import bitclub.Trabajador;
import bitclub.Videoclub;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.management.timer.Timer;

/**
 * @author Bit Company
 */
public class OpcionesAlquiler {

    public static void opcionAlquilar(Trabajador trabajador) {
        //Si no tenenmos un cliente debemos pedirlo
        Cliente cliente = OpcionesClientes.seleccionarCliente();
        //Si se pulsa en salir devolverá null y entonces salimos
        if (cliente == null) {
            return;
        }
        opcionAlquilar(cliente, trabajador);
    }

    public static void opcionAlquilar(Cliente cliente) {

        opcionAlquilar(cliente, null);
    }

    /**
     * Opcion para seleccionar un cliente, un grupo de artículos y efectuar un alquiler
     */
    public static void opcionAlquilar(Cliente cliente, Trabajador trabajador) {

        //Si el cliente está dado de baja no puede alquilar
        if (!cliente.isActivo()) {
            System.out.println("\nCliente dado de baja\n");
            BitUtil.esperaEnter();
            return;
        }

        Date ahora = new Date();
        int numDias;
        Date entrega;
        double precio;

        //Necesitamos artículos para meter en la lista de Articulos
        TreeSet<ArticuloAlquilado> listArticuloAlquilado = new TreeSet();

        //Este es un artículo suelto
        Articulo articulo = null;

        BitUtil.borra();

        int respuesta;
        do {

            //Mostramos el cliente y las cosas que lleva seleccionadas hasta ahora
            System.out.println(cliente.toStringLinea());
            System.out.println("\n");
            System.out.println("Articulos\n_____________________________");
            int contador = 0;
            for (ArticuloAlquilado aa : listArticuloAlquilado) {
                articulo = aa.getArticulo();
                contador++;
                System.out.println("");
                System.out.println("" + contador + ".-" + articulo.getTitulo() + " (" + articulo.getAno() + ") [Cod. " + articulo.getId() + "]");
            }
            System.out.println("_____________________________\n\n");

            respuesta = BitUtil.muestraMenu("LISTA DE ALQUILER", new String[]{"Añadir pelicula", "Añadir videojuego", "Cancelar"}, "Realizar Alquiler");
            switch (respuesta) {
                case 1:
                    articulo = OpcionesPeliculas.seleccionarPelicula(true);
                    if (articulo == null) {
                        break;
                    }
                    numDias = articulo.getTarifa().getNumDias();
                    entrega = new Date(ahora.getTime() + Timer.ONE_DAY * numDias);
                    precio = articulo.getTarifa().getPrecio();

                    //Comprobamos que el articulo no está ya dentro de la lista
                    if (!listArticuloAlquilado.add(new ArticuloAlquilado(articulo, entrega, precio))) {
                        System.out.println("El articulo ya estaba en la lista");
                    }
                    break;
                case 2:
                    articulo = OpcionesVideojuegos.seleccionarVideojuego(true);
                    if (articulo == null) {
                        break;
                    }
                    numDias = articulo.getTarifa().getNumDias();
                    entrega = new Date(ahora.getTime() + Timer.ONE_DAY * numDias);
                    precio = articulo.getTarifa().getPrecio();

                    //Comprobamos que el articulo no está ya dentro de la lista
                    if (!listArticuloAlquilado.add(new ArticuloAlquilado(articulo, entrega, precio))) {
                        System.out.println("\nEl articulo ya estaba en la lista\n");
                        BitUtil.esperaEnter();
                    }
                    break;
                case 3:
                    return;
            }
            if (respuesta == 0 && listArticuloAlquilado.isEmpty()) {
                System.out.println("No ha seleccionado ningun articulo, se cancela alquiler");
                BitUtil.esperaEnter();
                return;
            }
        } while (respuesta != 0);

        boolean correcto = BitUtil.dameConfirmacion("Todo correcto? (S/N) ");
        if (!correcto) {
            System.out.println("Alquiler cancelado");
            BitUtil.esperaEnter();
            return;
        }
        BitUtil.borra();

        //Le pasamos la lista de articulosAlquilados a las ofertas para que lo modifiquen si es necesario
        OfertaDiaSemana.comprobarOferta(listArticuloAlquilado);
        OfertaNumeroArticulo.comprobarOferta(listArticuloAlquilado);

        //Calculamos el precio total
        double precioTotal = 0;
        for (ArticuloAlquilado a : listArticuloAlquilado) {
            precioTotal += a.getPrecioAlquiler();
        }

        if (cliente.getSaldo() >= precioTotal && trabajador != null) {
            boolean monedero = BitUtil.dameConfirmacion("Quiere pagar a traves de su monedero? (s/n) ");
            if (monedero) {
                cliente.setSaldo(cliente.getSaldo() - precioTotal);
                cliente.actualizar();
                System.out.println("Se ha restado el dinero correctamente de su monedero");
                BitUtil.esperaEnter();
            } else {
                System.out.println("Pague: " + precioTotal);
            }
        } else if (cliente.getSaldo() < precioTotal && trabajador != null) {
            System.out.println("No dispone de saldo suficiente. Pague: " + precioTotal);
            BitUtil.esperaEnter();
        } else if (cliente.getSaldo() >= precioTotal && trabajador == null) {
            cliente.setSaldo(cliente.getSaldo() - precioTotal);
            cliente.actualizar();
            System.out.println("Se ha restado el dinero correctamente de su monedero");
            BitUtil.esperaEnter();
        } else if (cliente.getSaldo() < precioTotal && trabajador == null) {
            System.out.println("No puede alquilar en cajero ya que no dispone de saldo.");
            BitUtil.esperaEnter();
            return;
        }


        Alquiler alquiler = new Alquiler(cliente, new Date(), listArticuloAlquilado, precioTotal, 0, trabajador);
        alquiler.nuevo();

        String concepto = cliente.getNombre() + " " + cliente.getApellidos() + " - " + listArticuloAlquilado.size() + " articulos alquilados";
        Movimiento m = new Movimiento(concepto, ahora, precioTotal);
        m.nuevo();

        for (ArticuloAlquilado aa : listArticuloAlquilado) {
            Articulo a = aa.getArticulo();
            a.setDisponible(false);
            a.setVecesAlquilada(a.getVecesAlquilada() + 1);
            a.actualizar();
        }

        BitUtil.borra();
        //Ticket
        Videoclub v = Videoclub.seleccionar();
        System.out.println(v.toString());
        System.out.println(alquiler.toString());
        BitUtil.esperaEnter();

    }

    /**
     * Devolucion de un artículo o varios
     */
    public static void opcionDevolver(Trabajador trabajador) {
        Cliente cliente = OpcionesClientes.seleccionarCliente();
        //Si se pulsa en salir devolverá null y entonces salimos
        if (cliente == null) {
            return;
        }
        opcionDevolver(cliente, trabajador);
    }

    public static void opcionDevolver(Cliente cliente) {
        opcionDevolver(cliente, null);
    }

    public static void opcionDevolver(Cliente cliente, Trabajador trabajador) {

        Date ahora = new Date();
        int dias;
        double recargo;
        double recargoFinal = 0;
        int contador;
        int respuesta;
        HashSet<Alquiler> listAlquileresActualizar = new HashSet();
        List<ArticuloAlquilado> listArticuloAlquilado = new ArrayList();
        List<String> listArticuloAlquiladoRecargo = new ArrayList();
        List<Alquiler> listAlquiler = Alquiler.seleccionarAlquilerCliente(cliente);

        String[] opciones = null;

        boolean monedero = false;

        for (Alquiler alquiler : listAlquiler) {
            for (ArticuloAlquilado aa : alquiler.getListArticulos()) {
                listArticuloAlquilado.add(aa);
            }
        }

        if (listArticuloAlquilado.isEmpty()) {
            System.out.println("\nEste cliente no tiene ninguna pelicula alquilada\n");
            BitUtil.esperaEnter();
            return;
        }

        do {
            BitUtil.borra();
            opciones = new String[listArticuloAlquilado.size()];
            contador = 0;
            for (ArticuloAlquilado aa : listArticuloAlquilado) {
                opciones[contador] = "[" + aa.getArticulo().getId() + "] " + aa.getArticulo().getTitulo() + " " + BitUtil.muestraFecha(aa.getFechaEntrega());
                contador++;
            }

            ArticuloAlquilado aa = null;
            respuesta = BitUtil.muestraMenu("SELECCIONE DEVOLUCION", opciones);

            if (respuesta != 0) {
                aa = listArticuloAlquilado.get(respuesta - 1);

                //recargo
                contador = 0;
                if (ahora.getTime() > aa.getFechaEntrega().getTime()) {
                    dias = (int) Math.ceil((ahora.getTime() - aa.getFechaEntrega().getTime()) / Timer.ONE_DAY);
                    recargo = dias * aa.getArticulo().getTarifa().getRecargo();
                    listArticuloAlquiladoRecargo.add("[" + aa.getArticulo().getId() + "] " + aa.getArticulo().getTitulo() + ", Recargo: " + recargo);
                    Set<ArticuloAlquilado> sAA = new TreeSet();

                    for (Alquiler a : listAlquiler) {
                        sAA = a.getListArticulos();
                        for (ArticuloAlquilado x : sAA) {
                            if (x.equals(aa)) {
                                recargoFinal = recargoFinal + recargo;
                                a.setPrecioRecargo(a.getPrecioRecargo() + recargo);
                                listAlquileresActualizar.add(a);

                            }
                        }
                    }
                }
                //eliminamos de la lista
                listArticuloAlquilado.remove(aa);
                //eliminamos de la bd
                aa.eliminar();
                //ponemos disponible dicho articulo en la bbdd
                Articulo a = aa.getArticulo();
                a.setDisponible(true);
                a.actualizar();
            }
            if (listArticuloAlquilado.isEmpty()) {
                respuesta = 0;
            }
        } while (respuesta != 0);



        for (Alquiler alquileresActualizar : listAlquileresActualizar) {
            System.out.println(alquileresActualizar.getPrecioRecargo());
            alquileresActualizar.actualizar();
        }

        if (recargoFinal > 0) {

            String concepto = cliente.getNombre() + " " + cliente.getApellidos() + " - " + listArticuloAlquiladoRecargo.size() + " articulos con recargo";
            Movimiento m = new Movimiento(concepto, ahora, recargoFinal);
            m.nuevo();

            System.out.println("Peliculas con Recargo: \n");
            for (String peliculasRecargo : listArticuloAlquiladoRecargo) {
                System.out.println(peliculasRecargo);
            }
            System.out.println("El recargo total es de : " + recargoFinal);

            if (cliente.getSaldo() >= recargoFinal && trabajador != null) {
                monedero = BitUtil.dameConfirmacion("¿Desea pagar con monedero? (S/N).");
                if (monedero) {
                    cliente.setSaldo(cliente.getSaldo() - recargoFinal);
                    cliente.actualizar();
                } else {
                    System.out.println("Deme " + recargoFinal + " €.");
                    BitUtil.esperaEnter();
                }
            } else if (cliente.getSaldo() < recargoFinal && trabajador != null) {
                System.out.println("No tiene saldo en su cuenta.");
                System.out.println("Deme " + recargoFinal + " €.");
                BitUtil.esperaEnter();
            } else if (cliente.getSaldo() >= recargoFinal && trabajador == null) {
                cliente.setSaldo(cliente.getSaldo() - recargoFinal);
                cliente.actualizar();
                System.out.println("Se ha restado el dinero correctamente de su monedero");
                BitUtil.esperaEnter();
            } else if (cliente.getSaldo() < recargoFinal && trabajador == null) {
                System.out.println("No dispone de saldo para el recargo. Se ha quedado con credito negativo por favor acuda al videoclub cuanto antes");
                cliente.setSaldo(cliente.getSaldo() - recargoFinal);
                cliente.actualizar();
                BitUtil.esperaEnter();
            }
        } else {
            System.out.println("No hay recargo.");
            BitUtil.esperaEnter();
        }
    }
}
